/*
1:下载axios  yarn add axios
2:创建axios副本，配制基地址
3:定义请求与响应拦截
4：暴露出去
5：api下导入使用

基地址：环境变量

vite处理环境变量
   开发环境
      根目录创建 .env.development
      定义变量  VITE_ 开头   VITE_APP_URL='123'
      访问：import.meta.env.VITE_APP_URL
   生产环境
      根目录创建 .env.production
      定义变量  VITE_    VITE_APP_URL='123'
      访问：import.meta.env.VITE_APP_URL
*/
import axios, { type Method } from 'axios'
import type { ApiRes } from '@/types/request'
import { showFailToast } from 'vant'
import { useUser } from '@/stores'
import router from '@/router'
const instance = axios.create({
  baseURL: import.meta.env.VITE_APP_URL,
  timeout: 5000
})

instance.interceptors.request.use(
  config => {
    // 1:随便加，不需要token加了不报错
    // 2：不需要token加了报错
    const store = useUser()
    if (store.userInfo?.token) {
      config.headers.Authorization = `Bearer ${store.userInfo?.token}`
    }

    return config
  },
  err => {
    return Promise.reject(err)
  }
)
instance.interceptors.response.use(
  res => {
    // 状态码 2开头
    if (res.data.code === 10000) {
      return res.data
    } else {
      // 提示
      showFailToast(res.data.message)
      return Promise.reject(new Error(res.data.message))
    }
  },
  err => {
    // token失效
    /*
    if(判断状态码){
      // 清空token与用户信息
      // 提示
      // 返回登录页
    }
    */
    if (err.response && err.response.status === 401) {
      const store = useUser()
      store.logout()
      showFailToast(err.response.data.message)
      // router   vue文件中用  useRouter    ts  和vue2无区别
      /*
       路由传参
         vue2是三种
           query
           params   (结合name)            
           动态路由匹配
         vue3 二种
            query       
            动态路由匹配
            传
              router.push('/xxx?参数名=值')
            收
              const route=useRoute()
              route.query.参数名
      */
      console.log('router', router)
      // router.currentRoute.value.fullPath获取当前路由的路由数据
      router.push('/login?redirect=' + router.currentRoute.value.fullPath)
    }
    //
    // 状态码 非2开头
    return Promise.reject(err)
  }
)
const request = <T>(url: string, method: Method = 'get', xxx?: object) => {
  // 处理get 请求传params  post 传data
  const methodType =
    {
      get: 'params',
      post: 'data'
    }[method.toLowerCase()] || 'data'
  return instance<any, ApiRes<T>>({
    url: url,
    method: method,
    [methodType]: xxx
  })
}

export default request
